package user

import (
	"errors"
	"svntool/application/models/tokens"
	"svntool/db/tables"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/context"
	"github.com/astaxie/beego/orm"
	"github.com/astaxie/beego/validation"
)

//用户检测过滤器
var FilterUser = func(ctx *context.Context) {
	if !tokens.CkUser(ctx) {
		ctx.Redirect(302, "/")
	}
}

type Account struct {
}

/**
 * 根据用户情况，决定渲染对应的视图
 */
func (a *Account) Show(ctx *context.Context) string {
	cnt := new(tables.Users).GetUserNum()
	//如果注册用户数为0
	if cnt == 0 {
		//显示注册页面
		return "account/register.tpl"
	} else {
		//验证登录
		if tokens.CkUser(ctx) {
			//已登录，显示主面板
			ctx.Redirect(302, "/main")
			return ""
		} else {
			//未登录，显示登录面板
			return "account/login.tpl"
		}
	}
}

/**
 * 登陆,返回用户信息
 */
func (a *Account) Login(ctx *context.Context) (info map[string]interface{}, err error) {
	ctx.Request.ParseForm()
	username, password, valid := ctx.Input.Query("username"), ctx.Input.Query("password"), validation.Validation{}
	//验证参数
	valid.Required(username, "username")
	valid.Required(password, "password")
	if valid.HasErrors() {
		// 打印错误信息
		for _, err := range valid.Errors {
			return nil, errors.New(err.Key + " " + err.Message)
		}
	}

	u := tables.Users{}

	//没有该用户
	if _, err := u.GetByUsernameAndPassword(username, password); err == orm.ErrNoRows {
		return nil, errors.New("用户名或密码错误")
	}

	tokens_db := new(tables.Tokens).GetByUid(u.Id)
	tokens_model := tokens.Token_model
	token := tokens_model.Update(tokens_db)
	//返回信息
	userinfo := map[string]interface{}{"uid": u.Id, "token": token}
	return userinfo, nil
}

/**
 * 注册
 */
func (a *Account) Register(ctx *context.Context) (info map[string]interface{}, err error) {
	u := tables.Users{}
	if ctx.Request.Form == nil {
		ctx.Request.ParseForm()
	}
	if err := beego.ParseForm(ctx.Request.Form, &u); err != nil {
		return nil, errors.New("解析到结构体出错")
	}
	name, username, password, valid := ctx.Input.Query("name"), ctx.Input.Query("username"), ctx.Input.Query("password"), validation.Validation{}
	//验证参数
	valid.Required(name, "name")
	valid.Required(username, "username")
	valid.Required(password, "password")
	if valid.HasErrors() {
		// 打印错误信息
		for _, err := range valid.Errors {
			return nil, errors.New(err.Key + " " + err.Message)
		}
	}

	tokens_model := tokens.Token_model
	tokens, token := tokens_model.Create()

	u.Tokens = &tokens

	//保存用户
	uid, err := u.AddUser()

	if err != nil {
		return nil, errors.New(err.Error())
	}

	//返回登录结果
	userinfo := map[string]interface{}{"uid": uid, "token": token}
	return userinfo, nil
}

/**
 * 退出
 */
func (a *Account) Logout(ctx *context.Context) {
	uid := tokens.Token_parse_model.GetUid(ctx)
	//获取用户
	tokens_db := new(tables.Tokens).GetByUid(uid)
	//删除token
	tokens_model := tokens.Token_model
	tokens_model.Delete(tokens_db)
	ctx.Redirect(302, "/")
}
